const express=require('express')

const app=express()
const joi=require('joi')

//导入并配置cors中间件
const cors=require('cors')
app.use(cors())

//配置解析表单数据的中间件,(只能解析x-www----格式的数据)
app.use(express.urlencoded({extended:false}))

//在路由之前封装res.cc函数
app.use((req,res,next)=>{
    //默认值为1表示失败情况
    //err值可能是一个错误对象也可能是一个错误的描述字符串
    res.cc=function(err,status=1){
        res.send({
            status,
            message:err instanceof Error ? err.message : err,

        })
    }
    next()
})

//在路由前配置解析token的中间件
const expressJWT=require('express-jwt')
const config=require('./config')

app.use(expressJWT({secret:config.jwtSecretKey}).unless({path:[/^\/api/]}))

//导入使用用户路由模块
const userRouter=require('./rooter/user')
app.use('/api',userRouter)

//导入使用用户信息的路由模块
const userinfoRouter=require('./rooter/userinfo')
app.use('/my',userinfoRouter)

//导入并使用电影分类的路由模块
const movieCateRouter=require('./rooter/moviecate')
app.use('/my/movie',movieCateRouter)

//导入并使用订单路由模块
const orderRouter=require('./rooter/order')
app.use('/my',orderRouter)

//导入并使用座位路由模块
const siteRouter=require('./rooter/site')
app.use('/movie',siteRouter)


//定义错误级别的中间件
app.use((err,req,res,next)=>{
    //验证失败导致的错误
    if(err instanceof joi.ValidationError) return res.cc(err)
    //身份认证失败（token：）
    if(err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
    //未知错误
    res.cc(err)
})

app.listen(3007,()=>{
    console.log('api server running at http://127.0.0.1:3007')
})